package 反射.reflect;

import org.junit.Test;

import java.lang.reflect.Constructor;

/**
 * 获取类的构造器，并对其进行操作
 */
public class testConstructor {
    @Test//测试类注解，要导入junit
    public void testConstructor() {
        //反射第一步，必须先得到这个类的Class对象
        Class c = Cat.class;

        //获取类的全部构造器，返回的是一个数组，构造器可能有多个（有参无参）
        //Constructor[] constructors =c.getConstructors();//获取public修饰的构造器
        Constructor[] constructors = c.getDeclaredConstructors();//获取所有构造器
        //遍历数组中的每个构造器对象
        for (Constructor constructor : constructors) {
            //输出构造器名字和参数个数
            System.out.println(constructor.getName() + "--->" + constructor.getParameterCount());
        }
    }

    @Test
    public void testGetConstructor() throws Exception {
        //1.反射第一步，必须先得到这个类的Class对象
        Class c = Cat.class;

        //2.获取某个构造器，无参
        //getConstructor:只能拿到public修饰的
        //Constructor constructor = c.getConstructor();//public
        Constructor constructor = c.getDeclaredConstructor();//所有
        //输出构造器名字和参数个数
        System.out.println(constructor.getName() + "--->" + constructor.getParameterCount());


        constructor.setAccessible(true);//禁止访问控制(暴力反射)
        Cat cat = (Cat) constructor.newInstance();//调用构造器，强转
        System.out.println(cat);

        //3.获取有参构造器
        //Constructor constructor1 = c.getConstructor(String.class, int.class);//public
        Constructor constructor1 = c.getDeclaredConstructor(String.class, int.class);//所有
        //输出构造器名字和参数个数
        System.out.println(constructor1.getName() + "--->" + constructor1.getParameterCount());

        constructor1.setAccessible(true);//禁止访问控制(暴力反射)
        Cat cat2 = (Cat) constructor1.newInstance("测试",18);//调用构造器，强转
        System.out.println(cat2);
    }

}
